/**
 * autho fengbin
 * 2008-9-17 
 */
package com.wsj.util.tool;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author fengbin
 *  静态页面生成,使用于使用模板生成静态页面.
 *  先调用setParament() 方法设置参数, 然后调用createHtml() 方法生成静态页面
 *  
 *  
 */
public class HtmlCreateByTemplatesObj 
{
	Log logger=LogFactory.getLog(this.getClass());
	
	//存放生成的文件路径
	private String filePath="html"+File.pathSeparator+"directSeed"+File.separator;
	
	//文件模板路径
	private String templateFilePath=File.pathSeparator+"template"+File.pathSeparator+"default.htm";
	
	
	//数据源Map
	private Map<String, String> dataMap;
	
	//文件名,用于修改不带扩展名
	private String oldFileName="";
	
	
	/*****
	 * 设置参数
	 * @param templateFilePath
	 * @param dataMap
	 * @param filePath
	 * @param oldFileName
	 */
	public void setParament(String templateFilePath,Map<String, String> dataMap,String filePath,String oldFileName)
	{
		if(templateFilePath!=null && !templateFilePath.equals(""))
		{
			this.templateFilePath = templateFilePath;
		}
		
		if(dataMap!=null  && !dataMap.isEmpty())
		{
			this.dataMap = dataMap;
		}
		
		if(filePath!=null  && !filePath.equals(""))
		{
			this.filePath = filePath;
		}
		
		if(oldFileName!=null  && !oldFileName.equals(""))
		{
			this.oldFileName = oldFileName;
		}
	}
	
	/*****
	 * 生成静态页面,返回生成的html的文件名
	 * @return
	 */
	public String createHtml(HttpServletRequest request,HttpServletResponse response)
	{
		String retFileame = "";
		 try {
			 StringBuffer buffer=new StringBuffer("");
			String templateContent="";
			 FileInputStream fileinputstream = new FileInputStream(templateFilePath);//读取模块文件
			 InputStreamReader isr = new InputStreamReader(fileinputstream, "UTF-8"); 
			 Reader in = new BufferedReader(isr); 
			 int ch; 
			 while ((ch = in.read()) > -1) 
			 { 
			  buffer.append((char)ch); 
			 } 
			 in.close(); 
			 templateContent = buffer.toString();
			 logger.info("以下是模板内容：<br>"+templateContent+"<br> 以下是置换以后的html内容<br><hr>");
			 
			 //将Map中的数据,替换掉文本中的标志位,将Map中的#key# 替换成 map中的值.
			 templateContent = this.replaceSign(templateContent , dataMap); 

			 // 根据时间得文件名
			 String filename="";
			 if(oldFileName!=null  && !oldFileName.equals(""))
			 {
				 filename = oldFileName+".html";
			 }
			 else
			 {
				 //使用新的文件名
				  filename=loadUploadFileName()+".html";
			 }
			 
			 FileOutputStream fileoutputstream = new FileOutputStream(createNewFilePath(request) + filename);//建立文件输出流
			 Writer out = new OutputStreamWriter(fileoutputstream, "UTF-8"); 
			 out.write(templateContent);
			 out.flush();
			 out.close();
			 
			 retFileame = filename;
			 
			
		} catch (FileNotFoundException e) 
		{
			logger.error("\n\n生成静态文件出错!");
			e.printStackTrace();
		} catch (IOException e) {
			logger.error("\n\n生成静态文件IO异常!");
			e.printStackTrace();
		}
		
		return retFileame;
	}

	
	  /****
     * 
     * 获取文件上传的文件名(25位的随机数字)
     * @return
     */
    
    public String loadUploadFileName()
    {
        StringBuffer fileName=new StringBuffer("");
        
        SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");
        
        //16位
        fileName.append(format.format(new Date()));
        
        //还需要9位随机数字
        fileName.append(random(9));
        return fileName.toString();
        
    }
    
    
    /**
     * 获取随机数字
     * @param size
     * @return
     */
    public String random(int size)
    {
        StringBuffer ret=new StringBuffer("");
        Random r=new Random();
        
        for(int j=0;j<size;j++)
        {
            int t=r.nextInt(10);
            
            ret.append(t);
        }
        return ret.toString();
    }

    
    /****
	 * 获取新的生成文件的链接
	 * @param request
	 * @return
	 */
	private String createNewFilePath(HttpServletRequest request) 
	{
		 String d=File.separator;
		 String fileRealPath="";
		 String retFilePath="";
		 
		  if(d.equals("\\"))//windows
		  {
			  fileRealPath=request.getSession().getServletContext().getRealPath("\\");;
		  }
		  else
		  {
			  fileRealPath=request.getSession().getServletContext().getRealPath("/");;
		  }
		 
		  retFilePath=fileRealPath+filePath;
			
			return retFilePath; 
	}
	
	
	/******
	 * 将字符串中的#key# ,替换成value
	 * @param templateContent
	 * @param dataMap2
	 * @return
	 */
	private String replaceSign(String templateContent, Map<String, String> dataMap) 
	{
		
		Set keySet=dataMap.keySet();
		for(Iterator it= keySet.iterator();it.hasNext();)
		{
			String key= (String)it.next();
			String value=(String)dataMap.get(key);
			templateContent =templateContent.replaceAll("#"+key+"#", value);
		}
		
		return templateContent;
	}

	
	
	public Map<String, String> getDataMap() {
		return dataMap;
	}


	public void setDataMap(Map<String, String> dataMap) {
		this.dataMap = dataMap;
	}


	public String getFilePath() {
		return filePath;
	}


	public void setFilePath(String filePath) {
		this.filePath = filePath;
	}


	public String getTemplateFilePath() {
		return templateFilePath;
	}


	public void setTemplateFilePath(String templateFilePath) {
		this.templateFilePath = templateFilePath;
	}


	public String getOldFileName() {
		return oldFileName;
	}


	public void setOldFileName(String oldFileName) {
		this.oldFileName = oldFileName;
	}


//	/**
//	 * @param args
//	 */
//	public static void main(String[] args) 
//	{
//		
//		HtmlCreateByTemplatesObj createHtmlByTemplatesObj = new HtmlCreateByTemplatesObj();
//		Map<String,String> map=new HashMap<String,String>(6);
//		map.put("title","我的标题");
//		map.put("content", "我的内容");
//		createHtmlByTemplatesObj.setDataMap(map);
//		//生成文件的路径
//		createHtmlByTemplatesObj.setFilePath("E:\\apache-tomcat-5.5.25\\webapps\\qqddc\\html\\directSeed\\");
//		//文件模板的路径
//		createHtmlByTemplatesObj.setTemplateFilePath("E:\\apache-tomcat-5.5.25\\webapps\\qqddc\\template\\default.htm");
//		//文件名
//		createHtmlByTemplatesObj.setOldFileName("20080917142146022095056");
//		String newFile=createHtmlByTemplatesObj.createHtml();
//		System.out.println("\n\n新的文件:"+newFile);
//	}

}
